"""
功能 ： 类似qq群功能
【1】 有人进入聊天室需要输入姓名，姓名不能重复
【2】 有人进入聊天室时，其他人会收到通知：Lucy 进入了聊天室
【3】 一个人发消息，其他人会收到： Lucy ： 一起出去玩啊。
【4】 有人退出聊天室，则其他人也会收到通知 : Lucy 退出了聊天室
【5】 扩展功能：服务器可以向所有用户发送公告:
                管理员消息： 大家好，欢迎进入聊天室。
"""
from socket import *
from multiprocessing import Process

ADDR = ("0.0.0.0",12122)

user = {}

def login(sock,name,address):
    if name in user or "管理" in name:
        sock.sendto("No".encode(), address)
    else:
        sock.sendto(b"OK", address)
        msg = "%s 进入聊天室" % name
        for key, value in user.items():
            sock.sendto(msg.encode(), value)
        user[name] = address


def chat(sock,name,content):
    msg = "%s : %s" % (name,content)
    for key,value in user.items():
        if key != name:
            sock.sendto(msg.encode(),value)

def exit(sock,name):
    if name in user:
        del user[name]
    msg = "%s 退出群聊" % name
    for key,value in user.items():
        sock.sendto(msg.encode(),value)

def do_request(sock):
    while True:
        request,addr = sock.recvfrom(1024)
        tmp = request.decode().split("\t", 2)
        if tmp[0] == "LOGIN":
            login(sock,tmp[1],addr)
        elif tmp[0] == "CHAT":
            chat(sock,tmp[1],tmp[2])
        elif tmp[0] == "EXIT":
            exit(sock,tmp[1])

def main():
    sock = socket(AF_INET,SOCK_DGRAM)
    sock.bind(ADDR)
    p = Process(target=do_request, args=(sock,))
    p.start()
    while True:
        content = input("管理员消息:")
        msg = "CHAT\t管理员消息\t"+ content
        sock.sendto(msg.encode(),ADDR)


if __name__ == '__main__':
    main()







